package com.kaigejava.zhengshufanzhuan20190810;

import com.alibaba.fastjson.JSON;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

/**
 * Created by kaigejava on 2019/8/10.
 * 给出一个 32 位的有符号整数，你需要将这个整数中每位上的数字进行反转。
 * 示例 1:
 * 输入: 123
 * 输出: 321
 * 示例 2:
 * 输入: -123
 * 输出: -321
 * 示例 3:
 * 输入: 120
 * 输出: 21
 * 注意:
 * 假设我们的环境只能存储得下 32 位的有符号整数，则其数值范围为 [−2的31次方,  2的31次方 − 1]。
 * 请根据这个假设，如果反转后整数溢出那么就返回 0。
 */
@Slf4j
public class zhengshufanzhuan {

    @Test
    public void zhengshufanzhuanTest(){
        int x = -9646301;
       // reverse(x);
        reverse2(x);
    }

    /**
     * 思路：
     * 先将x转字符串。
     * 判断第一位和最后一位。
     * 是否是负数，是否是0
     * 然后在根据不同情况进行判断
     * @param x
     * @return
     */
    public int reverse(int x) {
       String strX = Integer.valueOf(x).toString();
       char [] charArr = strX.toCharArray();
       int length = charArr.length;
       String [] strArr = new String [length];
       for(int i =0;i<length;i++){
           strArr[i] = String.valueOf(new char[]{charArr[i]});

       }
       String [] newStrArr =   new String [length];
       String fasterStr =  strArr[0];
       String lastStr = strArr[length-1];
       int index = 0;
        if("-".equals(fasterStr)
                && "0".equals(lastStr)){
            newStrArr =   new String [length-1];
            newStrArr[0] = fasterStr;
            for(int i= length-2; i >0;i--){
                index++;
                String str = strArr[i];
                newStrArr[index] = str;

            }
        }else if("0".equals(lastStr)){
           newStrArr =   new String [length-1];
           for(int i= length-2; i >=0;i--){
               String str = strArr[i];
               newStrArr[index] = str;
               index++;
           }
       }else if("-".equals(fasterStr)){
           newStrArr[0] = fasterStr;
           for(int i= length-1; i >0;i--){
               index++;
               String str = strArr[i];
               newStrArr[index] = str;
           }
       }else{
           for(int i= length-1; i >=0;i--){
               String str = strArr[i];
               newStrArr[index] = str;
               index++;
           }
       }


        String str = "";
        for(int i = 0;i<newStrArr.length;i++){
            str+= newStrArr[i];
        }
       try{
           if(""!= str && null != str){
               Integer ix = Integer.parseInt(str);
               x=ix.intValue();
           }
       }catch (Exception e){
            return 0;
       }

        log.info("==:{}",x);
        return  x;
    }

    /**
     * 用数学思维来写，这个题挺简单的
     *  假设 int x = -9646301;
     *  反过来之后：-1036469
     *  其实就是最低位和最高位互换。其实也就是10的运算
     * @param x
     * @return
     */
    public int reverse2(int x) {
        //用数学思维来看
        int rpc = 0;
        while (x != 0)
        {
            //假设 int x = -9646301;
            int newrpc = rpc*10 + x%10;
            log.info("rpc*10:{},x%10:{}，newrpc：{}",(rpc*10),x%10,newrpc);
            if ((newrpc - x%10)/10 != rpc){
                return 0;
            }
            rpc = newrpc;
            x = x/10;
        }
        log.info("==:{}",rpc);
        return rpc;
    }


    /**
     * 使用字符串的方法反正
     * @param x
     * @return
     */
    public int reverse3(int x) {
        try {
            if(x > 0) {
                StringBuilder str = new StringBuilder().append(x);
                return Integer.parseInt(str.reverse().toString());
            }else {
                StringBuilder str = new StringBuilder().append(-x);
                return Integer.parseInt(str.reverse().toString())*(-1);
            }
        }catch (NumberFormatException e) {
            return 0;
        }
    }

    /**
     * 使用math函数
     * @return
     */
    public int reverse4(int x){
        //区域 右端点
        double start =  Math.pow(2, 31) - 1;
        //区域 左端点
        double end = -Math.pow(2, 31);
        if(x<end && x>start){
            return 0;
        }
        //获取原始数字符号
        float df = Math.signum(x);
        Integer intDf = Math.round(df);
        // 取绝对值
        int i = Math.abs(x);
        //使用sring的反转方式
        StringBuilder str = new StringBuilder().append(i).reverse();
        try {
            x = Integer.parseInt(str.toString());
        }catch (Exception e){
            return 0;
        }
        return  x*intDf ;
    }


    /**
     * 位移运算+math函数
     * @param x
     * @return
     */
    public int reverse5(int x) {
        int res = 0;
        int of = ((1 << 31) - 1) / 10;
        while (x != 0) {
            if (Math.abs(res) > ((1 << 31) - 1) / 10){
                return 0;
            }
            res = res * 10 + x % 10;
            x /= 10;
        }
        return res;
    }


}
